using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._CartographyTools._CartographicRefinement
{
    /// <summary>
    /// <para>Create Overpass</para>
    /// <para>Creates bridge parapets and polygon masks at line intersections to indicate overpasses.</para>
    /// <para>在线交叉点创建桥梁护栏和多边形蒙版以指示立交桥。</para>
    /// </summary>    
    [DisplayName("Create Overpass")]
    public class CreateOverpass : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public CreateOverpass()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_above_features">
        /// <para>Input Above Features</para>
        /// <para>The input line feature layer containing lines that intersect—and will be symbolized as passing above—lines in the Input Below Features parameter.</para>
        /// <para>输入线要素图层包含与输入下方要素参数中的线相交的线，并将符号化为通过上方的线。</para>
        /// </param>
        /// <param name="_in_below_features">
        /// <para>Input Below Features</para>
        /// <para>The input line feature layer that intersects—and will be symbolized as passing below—lines in the Input Above Features parameter. These features will be masked by the polygons created in the Output Overpass Feature Class parameter.</para>
        /// <para>与 Input Above 要素参数中的线相交的输入线要素图层，并将符号化为在下方传递。这些要素将被在输出立交桥要素类参数中创建的面所掩盖。</para>
        /// </param>
        /// <param name="_margin_along">
        /// <para>Margin Along</para>
        /// <para>Sets the length of the mask polygons along the Input Above Features parameter by specifying the distance in page units that the mask should extend beyond the width of the stroke symbol of the Input Below Features parameter. The Margin Along parameter must be specified, and it must be greater than or equal to zero. Choose a page unit (points, millimeters, and so on) for the margin; the default is points.</para>
        /// <para>通过指定蒙版应延伸到“输入下方要素”参数的描边符号宽度的距离（以页为单位）来设置沿“输入上方要素”参数的掩膜面的长度。必须指定 Margin Along 参数，并且该参数必须大于或等于零。选择页边距的页面单位（磅、毫米等）;默认值为点数。</para>
        /// </param>
        /// <param name="_margin_across">
        /// <para>Margin Across</para>
        /// <para>Sets the width of the mask polygons across the Input Above Features parameter by specifying the distance in page units that the mask should extend beyond the width of the stroke symbol of the Input Below Features parameter. The Margin Across parameter must be specified, and it must be greater than or equal to zero. Choose a page unit (points, millimeters, and so on) for the margin; the default is points.</para>
        /// <para>通过指定掩码应延伸到“输入下方要素”参数的描边符号宽度的距离（以页面为单位）来设置跨“输入上方要素”参数的掩膜面的宽度。必须指定 Margin Across 参数，并且该参数必须大于或等于零。选择页边距的页面单位（磅、毫米等）;默认值为点数。</para>
        /// </param>
        /// <param name="_out_overpass_feature_class">
        /// <para>Output Overpass Feature Class</para>
        /// <para>The output feature class that will be created to store polygons to mask the Input Below Features parameter.</para>
        /// <para>将创建用于存储面以屏蔽要素下方输入参数的输出要素类。</para>
        /// </param>
        /// <param name="_out_mask_relationship_class">
        /// <para>Output Mask Relationship Class</para>
        /// <para>The output relationship class that will be created to store links between overpass mask polygons and the lines of the Input Below Features parameter.</para>
        /// <para>将创建的输出关系类，用于存储立交桥掩膜面与输入下方要素参数的线之间的链接。</para>
        /// </param>
        public CreateOverpass(object _in_above_features, object _in_below_features, string? _margin_along, string? _margin_across, object _out_overpass_feature_class, object _out_mask_relationship_class)
        {
            this._in_above_features = _in_above_features;
            this._in_below_features = _in_below_features;
            this._margin_along = _margin_along;
            this._margin_across = _margin_across;
            this._out_overpass_feature_class = _out_overpass_feature_class;
            this._out_mask_relationship_class = _out_mask_relationship_class;
        }
        public override string ToolboxName => "Cartography Tools";

        public override string ToolName => "Create Overpass";

        public override string CallName => "cartography.CreateOverpass";

        public override List<string> AcceptEnvironments => ["cartographicCoordinateSystem", "referenceScale"];

        public override object[] ParameterInfo => [_in_above_features, _in_below_features, _margin_along, _margin_across, _out_overpass_feature_class, _out_mask_relationship_class, _where_clause, _out_decoration_feature_class, _wing_type.GetGPValue(), _wing_tick_length];

        /// <summary>
        /// <para>Input Above Features</para>
        /// <para>The input line feature layer containing lines that intersect—and will be symbolized as passing above—lines in the Input Below Features parameter.</para>
        /// <para>输入线要素图层包含与输入下方要素参数中的线相交的线，并将符号化为通过上方的线。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Above Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_above_features { get; set; }


        /// <summary>
        /// <para>Input Below Features</para>
        /// <para>The input line feature layer that intersects—and will be symbolized as passing below—lines in the Input Above Features parameter. These features will be masked by the polygons created in the Output Overpass Feature Class parameter.</para>
        /// <para>与 Input Above 要素参数中的线相交的输入线要素图层，并将符号化为在下方传递。这些要素将被在输出立交桥要素类参数中创建的面所掩盖。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Below Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_below_features { get; set; }


        /// <summary>
        /// <para>Margin Along</para>
        /// <para>Sets the length of the mask polygons along the Input Above Features parameter by specifying the distance in page units that the mask should extend beyond the width of the stroke symbol of the Input Below Features parameter. The Margin Along parameter must be specified, and it must be greater than or equal to zero. Choose a page unit (points, millimeters, and so on) for the margin; the default is points.</para>
        /// <para>通过指定蒙版应延伸到“输入下方要素”参数的描边符号宽度的距离（以页为单位）来设置沿“输入上方要素”参数的掩膜面的长度。必须指定 Margin Along 参数，并且该参数必须大于或等于零。选择页边距的页面单位（磅、毫米等）;默认值为点数。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Margin Along")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public string? _margin_along { get; set; }


        /// <summary>
        /// <para>Margin Across</para>
        /// <para>Sets the width of the mask polygons across the Input Above Features parameter by specifying the distance in page units that the mask should extend beyond the width of the stroke symbol of the Input Below Features parameter. The Margin Across parameter must be specified, and it must be greater than or equal to zero. Choose a page unit (points, millimeters, and so on) for the margin; the default is points.</para>
        /// <para>通过指定掩码应延伸到“输入下方要素”参数的描边符号宽度的距离（以页面为单位）来设置跨“输入上方要素”参数的掩膜面的宽度。必须指定 Margin Across 参数，并且该参数必须大于或等于零。选择页边距的页面单位（磅、毫米等）;默认值为点数。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Margin Across")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public string? _margin_across { get; set; }


        /// <summary>
        /// <para>Output Overpass Feature Class</para>
        /// <para>The output feature class that will be created to store polygons to mask the Input Below Features parameter.</para>
        /// <para>将创建用于存储面以屏蔽要素下方输入参数的输出要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Overpass Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_overpass_feature_class { get; set; }


        /// <summary>
        /// <para>Output Mask Relationship Class</para>
        /// <para>The output relationship class that will be created to store links between overpass mask polygons and the lines of the Input Below Features parameter.</para>
        /// <para>将创建的输出关系类，用于存储立交桥掩膜面与输入下方要素参数的线之间的链接。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Mask Relationship Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_mask_relationship_class { get; set; }


        /// <summary>
        /// <para>Expression</para>
        /// <para><xdoc>
        ///   <para>An SQL expression used to select a subset of features in the Input Above Features parameter.</para>
        ///   <para>Use quotation marks—for example, "MY_FIELD"—or if you're querying personal geodatabases, enclose fields in square brackets—for example, [MY_FIELD].</para>
        ///   <para>See SQL reference for query expressions used in ArcGIS for more information on SQL syntax.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>一个 SQL 表达式，用于在 Input Above Features 参数中选择要素的子集。</para>
        ///   <para>使用引号（例如“MY_FIELD”），或者如果要查询个人地理数据库，请将字段括在方括号中，例如 [MY_FIELD]。</para>
        ///   <para>有关 SQL 语法的详细信息，请参阅 ArcGIS 中使用的查询表达式的 SQL 参考。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Expression")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _where_clause { get; set; } = null;


        /// <summary>
        /// <para>Output Decoration Feature Class</para>
        /// <para>The output line feature class that will be created to store parapet features.</para>
        /// <para>将创建用于存储女儿墙要素的输出线要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Decoration Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_decoration_feature_class { get; set; } = null;


        /// <summary>
        /// <para>Wing Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the wing style of the parapet features.</para>
        ///   <bulletList>
        ///     <bullet_item>Wing ticks angled between above and below features—The wing tick of the parapet will be angled between the Input Above Features parameter and the Input Below Features parameter. This is the default.</bullet_item><para/>
        ///     <bullet_item>Wing ticks parallel to below features—The wing tick of the overpass wing will be parallel to the Input Below Features parameter.</bullet_item><para/>
        ///     <bullet_item>No wing ticks created—No wing ticks will be created on the parapets.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定栏杆特征的翼型。</para>
        ///   <bulletList>
        ///     <bullet_item>在要素上方和下方要素之间成角度的翼刻度—女儿墙的翼形刻度将在“输入上方要素”参数和“输入下方要素”参数之间成角度。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>平行于以下要素的机翼刻度 - 立交桥机翼的机翼刻度将平行于输入下方要素参数。</bullet_item><para/>
        ///     <bullet_item>不会创建翅膀刻度 - 不会在栏杆上创建翅膀刻度。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Wing Type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _wing_type_value _wing_type { get; set; } = _wing_type_value._ANGLED;

        public enum _wing_type_value
        {
            /// <summary>
            /// <para>Wing ticks angled between above and below features</para>
            /// <para>Wing ticks angled between above and below features—The wing tick of the parapet will be angled between the Input Above Features parameter and the Input Below Features parameter. This is the default.</para>
            /// <para>在要素上方和下方要素之间成角度的翼刻度—女儿墙的翼形刻度将在“输入上方要素”参数和“输入下方要素”参数之间成角度。这是默认设置。</para>
            /// </summary>
            [Description("Wing ticks angled between above and below features")]
            [GPEnumValue("ANGLED")]
            _ANGLED,

            /// <summary>
            /// <para>Wing ticks parallel to below features</para>
            /// <para>Wing ticks parallel to below features—The wing tick of the overpass wing will be parallel to the Input Below Features parameter.</para>
            /// <para>平行于以下要素的机翼刻度 - 立交桥机翼的机翼刻度将平行于输入下方要素参数。</para>
            /// </summary>
            [Description("Wing ticks parallel to below features")]
            [GPEnumValue("PARALLEL")]
            _PARALLEL,

            /// <summary>
            /// <para>No wing ticks created</para>
            /// <para>No wing ticks created—No wing ticks will be created on the parapets.</para>
            /// <para>不会创建翅膀刻度 - 不会在栏杆上创建翅膀刻度。</para>
            /// </summary>
            [Description("No wing ticks created")]
            [GPEnumValue("NONE")]
            _NONE,

        }

        /// <summary>
        /// <para>Wing Tick Length</para>
        /// <para>The length of the parapet wings in page units. The length must be greater than or equal to zero; the default length is 1. Choose a page unit (points, millimeters, and so on) for the length; the default is points. This parameter does not apply to the Wing Type value of NONE.</para>
        /// <para>女儿墙翼的长度（以页为单位）。长度必须大于或等于零;默认长度为 1。选择页面单位（点、毫米等）作为长度;默认值为点数。此参数不适用于 NONE 的 Wing Type 值。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Wing Tick Length")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public string? _wing_tick_length { get; set; } = null;


        public CreateOverpass SetEnv(object cartographicCoordinateSystem = null, object referenceScale = null)
        {
            base.SetEnv(cartographicCoordinateSystem: cartographicCoordinateSystem, referenceScale: referenceScale);
            return this;
        }

    }

}